package com.season.design_pattern.singleton;

import com.mysql.cj.jdbc.admin.MiniAdmin;
import com.season.design_pattern.util.ThreadUtil;

/**
 * 懒汉式
 * 存在多线程访问的问题
 */
public class Mgr03 {
    private static Mgr03 INSTANCE;

    private Mgr03(){}

    public static Mgr03 getInstance(){
        if (INSTANCE == null){
            ThreadUtil.sleep(1); // 睡眠 1ms
            INSTANCE = new Mgr03();
        }
        return INSTANCE;
    }

    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("Mgr03.getInstance().hashCode() = " + Mgr03.getInstance().hashCode());
                }
            }).start(); // 直接run，只是在主线程运行run()方法，无法起到多线程的效果
            // start会启动新的线程，并且会让一个线程进入就绪状态，在调度系统分配时间片后，start()会进行相应的准备工作，然后执行run()方法内的内容
            // 也就是说start会重新开一个新的线程，实现多线程
        }
    }
}
